#ifndef RVIZ_VISUALIZATION_H
#define RVIZ_VISUALIZATION_H

#include <ros/ros.h>
#include <rviz/default_plugin/view_controllers/orbit_view_controller.h>
#include <rviz/display.h>
#include <rviz/render_panel.h>
#include <rviz/tool.h>
#include <rviz/tool_manager.h>
#include <rviz/view_controller.h>
#include <rviz/view_manager.h>
#include <rviz/visualization_manager.h>

#include <QObject>
#include <QVBoxLayout>

namespace project_template {

class RvizVisualization {
 public:
  /**
   * @brief 构造函数
   * @param layout
   */
  RvizVisualization(QVBoxLayout* layout);

  /**
   * @brief 设置固定坐标系
   * @param Frame_name
   */
  void SetFixedFrame(QString frame_name);

  /**
   * @brief 设置视角
   */
  void SetViewInit();

  /**
   * @brief 显示网格
   * @param cell_count
   * @param cell_size
   * @param color
   * @param enable
   */
  void DisplayGrid(int Cell_Count, int cell_size, QColor color, bool enable);

  /**
   * @brief 显示坐标轴
   * @param enable
   */
  void DisplayAxes(bool enable);

  /**
   * @brief 显示Marker
   * @param enable
   */
  void DisplayMarker(bool enable);

  /**
   * @brief 显示MarkerArray
   * @param enable
   */
  void DisplayMarkerArray(bool enable);

  /**
   * @brief 显示LaserCloud
   * @param enable
   */
  void DisplayLaserCloud(bool enable);

 private:
  /// @brief rviz render panel
  rviz::RenderPanel* render_panel_;
  /// @brief rviz visualization manager
  rviz::VisualizationManager* manager_;
  /// @brief rviz tool manager
  rviz::ToolManager* tool_manager_;
  /// @brief rviz display grid
  rviz::Display* grid_ = nullptr;
  /// @brief rviz display axes
  rviz::Display* axes_ = nullptr;

  /// @brief Marker(可扩展)
  rviz::Display* marker_ = nullptr;
  /// @brief MarkerArray(可扩展)
  rviz::Display* marker_array_ = nullptr;
  /// @brief 点云(PointCloud2)(可扩展)
  rviz::Display* laser_cloud_ = nullptr;
};

}  // namespace project_template
#endif  // RVIZ_VISUALIZATION_H
